home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d18 / tjock5.arc / KEYTTT5.PAS < prev    next >
Pascal/Delphi Source File  |  1989-02-12  |  17KB  |  591 lines

  1. {--------------------------------------------------------------------------}
  2. {                         TechnoJock's Turbo Toolkit                       }
  3. {                                                                          }
  4. {                              Version   5.00                              }
  5. {                                                                          }
  6. {                                                                          }
  7. {              Copyright 1986, 1989 TechnoJock Software, Inc.              }
  8. {                           All Rights Reserved                            }
  9. {                          Restricted by License                           }
  10. {--------------------------------------------------------------------------}
  11.  
  12.                      {--------------------------------}                                       
  13.                      {       Unit:   KeyTTT5          }
  14.                      {--------------------------------}
  15.  
  16.  
  17. {$S-,R-,V-,D-}       
  18.  
  19. unit KeyTTT5;
  20.  
  21. Interface
  22.  
  23. uses CRT, DOS;
  24.  
  25. type
  26.   Button = (NoB,LeftB,RightB,BothB);
  27.  
  28. {$IFDEF VER50}
  29.       Key_Idle_Type = procedure;
  30.       Key_Pressed_Type = procedure(var Ch:char);
  31. {$ENDIF}
  32.  
  33.           Key_Hooks = record
  34. {$IFDEF VER50}
  35.                            Idle_Hook:    Key_Idle_Type;
  36.                            Pressed_Hook: Key_Pressed_Type;
  37. {$ENDIF}
  38.                            Click       : Boolean;           {tactile keyboard click}
  39.                       end;
  40.  
  41.  
  42. var
  43.   Moused : boolean;
  44.   Horiz_Sensitivity : integer;
  45.   KTTT : Key_Hooks;      {used in getkey to jump to external procedure}
  46.  
  47. {$IFNDEF VER50}
  48.   Idle_Hook   : pointer;
  49.   Pressed_Hook: pointer;
  50. {$ENDIF}
  51.  
  52. {$IFDEF K_FULL}
  53. {if}
  54. {if}           CONST
  55. {if}           BackSp  = #8;       PgUp  = #201;      CtrlPgUp = #138;
  56. {if}           Tab     = #9;       PgDn  = #209;      CtrlPgDn = #246;
  57. {if}           Enter   = #13;      Endkey= #207;      CtrlEnd  = #245;
  58. {if}           Esc     = #27;      Home  = #199;      CtrlHome = #247;
  59. {if}           STab    = #143;     Ins   = #210;      Del      = #211;
  60. {if}
  61. {if}           LArr    = #203;      CtrlLArr    = #243;    CtrlPrtsc = #242;
  62. {if}           RArr    = #205;      CtrlRArr    = #244;
  63. {if}           UArr    = #200;
  64. {if}           DArr    = #208;
  65. {if}
  66. {if}
  67. {if}           CtrlA  = #1;          AltA  = #158;        Alt1 = #248;
  68. {if}           CtrlB  = #2;          AltB  = #176;        Alt2 = #249;
  69. {if}           CtrlC  = #3;          AltC  = #174;        Alt3 = #250;
  70. {if}           CtrlD  = #4;          AltD  = #160;        Alt4 = #251;
  71. {if}           CtrlE  = #5;          AltE  = #146;        Alt5 = #252;
  72. {if}           CtrlF  = #6;          AltF  = #161;        Alt6 = #253;
  73. {if}           CtrlG  = #7;          AltG  = #162;        Alt7 = #254;
  74. {if}           CtrlH  = #8;          AltH  = #163;        Alt8 = #255;
  75. {if}           CtrlI  = #9;          AltI  = #151;        Alt9 = #134;
  76. {if}           CtrlJ  = #10;         AltJ  = #164;        Alt0 = #135;
  77. {if}           CtrlK  = #11;         AltK  = #165;        Altminus  = #136;
  78. {if}           CtrlL  = #12;         AltL  = #166;        Altequals = #137;
  79. {if}           CtrlM  = #13;         AltM  = #178;
  80. {if}           CtrlN  = #14;         AltN  = #177;
  81. {if}           CtrlO  = #15;         AltO  = #152;
  82. {if}           CtrlP  = #16;         AltP  = #153;
  83. {if}           CtrlQ  = #17;         AltQ  = #144;
  84. {if}           CtrlR  = #18;         AltR  = #147;
  85. {if}           CtrlS  = #19;         AltS  = #159;
  86. {if}           CtrlT  = #20;         AltT  = #148;
  87. {if}           CtrlU  = #21;         AltU  = #150;
  88. {if}           CtrlV  = #22;         AltV  = #175;
  89. {if}           CtrlW  = #23;         AltW  = #145;
  90. {if}           CtrlX  = #24;         AltX  = #173;
  91. {if}           CtrlY  = #25;         AltY  = #149;
  92. {if}           CtrlZ  = #26;         AltZ  = #172;
  93. {if}
  94. {if}           F1  = #187;              sF1  = #212;
  95. {if}           F2  = #188;              sF2  = #213;
  96. {if}           F3  = #189;              sF3  = #214;
  97. {if}           F4  = #190;              sF4  = #215;
  98. {if}           F5  = #191;              sF5  = #216;
  99. {if}           F6  = #192;              sF6  = #217;
  100. {if}           F7  = #193;              sF7  = #218;
  101. {if}           F8  = #194;              sF8  = #219;
  102. {if}           F9  = #195;              sF9  = #220;
  103. {if}           F10 = #196;              sF10 = #221;
  104. {if}           F11 = #139;              sF11 = #141;
  105. {if}           F12 = #140;              sF12 = #142;
  106. {if}
  107. {if}           CtrlF1  = #222;          AltF1  = #232;
  108. {if}           CtrlF2  = #223;          AltF2  = #233;
  109. {if}           CtrlF3  = #224;          AltF3  = #234;
  110. {if}           CtrlF4  = #225;          AltF4  = #235;
  111. {if}           CtrlF5  = #226;          AltF5  = #236;
  112. {if}           CtrlF6  = #227;          AltF6  = #237;
  113. {if}           CtrlF7  = #228;          AltF7  = #238;
  114. {if}           CtrlF8  = #229;          AltF8  = #239;
  115. {if}           CtrlF9  = #230;          AltF9  = #240;
  116. {if}           CtrlF10 = #231;          AltF10 = #241;
  117. {if}           CtrlF11 = #154;          AltF11 = #156;
  118. {if}           CtrlF12 = #155;          AltF12 = #157;
  119. {if}
  120. {if}          {now the TTT mouse keys}
  121. {if}
  122. {if}           MUp     = #128;
  123. {if}           MDown   = #129;
  124. {if}           MLeft   = #130;
  125. {if}           MRight  = #131;
  126. {if}           MLeftB  = #133;
  127. {if}           MEnter  = #133;
  128. {if}           MEsc    = #132;
  129. {if}           MRightB = #132;
  130. {if}
  131. {$ENDIF}  {def K_Const}
  132. {$IFDEF VER50}
  133. Procedure No_Idle_Hook;
  134. Procedure No_Pressed_Hook(var Ch:char);
  135. Procedure Assign_Pressed_Hook(PassedProc : Key_pressed_Type);
  136. Procedure Assign_Idle_Hook(PassedProc : Key_Idle_Type);
  137. {$ENDIF}
  138. Procedure Set_Clicking(Clicking : boolean);
  139. Procedure Default_Settings;
  140. Function  Mouse_Installed:Boolean;
  141. Procedure Show_Mouse_Cursor;
  142. Procedure Hide_Mouse_Cursor;
  143. Procedure Get_Mouse_Action(var But: button; var Hor,Ver: integer);
  144. Procedure Move_Mouse(Hor,Ver: integer);
  145. Procedure Confine_Mouse_Horiz(Left,Right:integer);
  146. Procedure Confine_Mouse_Vert(Top,Bot:integer);
  147. Procedure Set_Mouse_Cursor_Style(OrdChar: integer);
  148. Function  Alt_Pressed:Boolean;
  149. Function  Ctrl_Pressed:Boolean;
  150. Function  LeftShift_Pressed: Boolean;
  151. Function  RightShift_Pressed: Boolean;
  152. Function  Shift_Pressed: Boolean;
  153. Function  CapsOn: Boolean;
  154. Function  NumOn: Boolean;
  155. Function  ScrollOn: Boolean;
  156. Procedure Set_Caps(On : boolean);
  157. Procedure Set_Num(On : boolean);
  158. Procedure Set_Scroll(On : boolean);
  159. Function  GetKey : Char;
  160. Procedure DelayKey(Time : integer);
  161.  
  162. Implementation
  163.  
  164. var
  165.    Key_Status_Bits : word absolute $0040:$0017;
  166.  
  167. {$IFNDEF VER50}
  168.    Procedure Call_Idle_Hook;
  169.           Inline($FF/$1E/Idle_Hook);
  170.  
  171.    Procedure Call_Pressed_Hook(Var CH : char);
  172.           Inline($FF/$1E/Pressed_Hook);
  173.  
  174. {$ENDIF}
  175.  
  176. {$F+}
  177.  Procedure No_Idle_Hook;
  178.  {empty procs}
  179.  begin
  180.  end; {of proc No_Idle_Hook}
  181.  
  182.  Procedure No_Pressed_Hook(var Ch:char);
  183.  {empty procs}
  184.  begin
  185.  end; {of proc No_Pressed_Hook}
  186. {$F-}
  187.  
  188. {$IFDEF VER50}
  189.  Procedure Assign_Pressed_Hook(PassedProc : Key_pressed_Type);
  190.  begin
  191.      KTTT.Pressed_Hook := PassedProc;
  192.  end;
  193.  
  194.  Procedure Assign_Idle_Hook(PassedProc : Key_Idle_Type);
  195.  begin
  196.      KTTT.Idle_Hook := PassedProc;
  197.  end;
  198. {$ENDIF}
  199.  
  200.  Procedure Set_Clicking(Clicking : boolean);
  201.  begin
  202.      KTTT.Click := Clicking;
  203.  end;
  204.  
  205.  
  206.     Procedure Default_Settings;
  207.     begin
  208.          With KTTT do
  209.          begin
  210. {$IFDEF VER50}
  211.              Idle_Hook    := No_Idle_Hook;
  212.              Pressed_Hook := No_Pressed_Hook;
  213. {$ELSE}
  214.              Idle_Hook    := Nil;
  215.              Pressed_Hook := Nil;
  216. {$ENDIF}
  217.              Click := false;
  218.          end;
  219.    end; {of proc Default_Settings}
  220.  
  221.  
  222. Function Mouse_Installed:Boolean;
  223. var
  224.   Reg: registers;
  225.  
  226.     Function Interrupt_loaded:boolean;
  227.     begin
  228.         Reg.Ax := 0;
  229.         Intr($33,Reg);
  230.         Interrupt_Loaded :=  Reg.Ax <> 0;
  231.     end;
  232.  
  233. begin
  234.     If Memw[$0000:$00CC] = 0 then
  235.        Mouse_Installed := false          {don't call interrupt if vector is zero}
  236.     else
  237.        Mouse_Installed := Interrupt_loaded;
  238. end; {Func Mouse_Installed}
  239.  
  240. Procedure Show_Mouse_Cursor;
  241. var
  242.   Reg: registers;
  243. begin
  244.     Reg.Ax := 1;
  245.     Intr($33,Reg);
  246. end; {Proc Show_Mouse_Cursor}
  247.  
  248. Procedure Hide_Mouse_Cursor;
  249. var
  250.   Reg : registers;
  251. begin
  252.     Reg.Ax := 2;
  253.     Intr($33,Reg);
  254. end; {Proc Hide_Mouse_Cursor}
  255.  
  256. Procedure Get_Mouse_Action(var But: button; var Hor,Ver: integer);
  257. var
  258.   Reg: registers;
  259. begin
  260.     with Reg do
  261.     begin
  262.         Ax := 3;
  263.         Intr($33,Reg);
  264.         Hor := Cx div 8;
  265.         Ver := Dx div 8;
  266.         {$B+}
  267.         If ((Bx and $1) <> $1)  and  ((Bx and $2) <> $2) then
  268.         begin
  269.             But := NoB;
  270.             exit;
  271.         end;
  272.         If ((Bx and $1) = $1)  and   ((Bx and $2) = $2) then
  273.            But := BothB
  274.         else
  275.         begin
  276.             If (Bx and $1) = $1 then
  277.                But := LeftB
  278.             else
  279.                But := RightB;
  280.         end;
  281.         {$B-}
  282.     end; {with}
  283. end;   {Get_Mouse_Action}
  284.  
  285. Procedure Move_Mouse(Hor,Ver: integer);
  286. var
  287.   Reg: registers;
  288. begin
  289.     Reg.Ax := 4;
  290.     Reg.Cx := pred(Hor*8);
  291.     Reg.Dx := pred(ver*8);
  292.     Intr($33,Reg);
  293. end; {Proc Move_mouse}
  294.  
  295. Procedure Confine_Mouse_Horiz(Left,Right:integer);
  296. var
  297.  Reg: registers;
  298. begin
  299.     Reg.Ax := 7;
  300.     Reg.Cx := pred(Left*8);
  301.     Reg.Dx := pred(Right*8);
  302.     Intr($33,Reg);
  303. end;
  304.  
  305. Procedure Confine_Mouse_Vert(Top,Bot:integer);
  306. var
  307.  Reg: registers;
  308. begin
  309.     Reg.Ax := 8;
  310.     Reg.Cx := pred(Top*8);
  311.     Reg.Dx := pred(Bot*8);
  312.     Intr($33,Reg);
  313. end;
  314.  
  315. Procedure Set_Mouse_Cursor_Style(OrdChar: integer);
  316. var
  317.   Reg: registers;
  318. begin
  319.    Reg.Ax := 10;
  320.    Reg.Bx := 0;        {software text cursor}
  321.    Reg.Cx := $7700;
  322.    Reg.Dx := $77 and OrdChar;
  323.    Intr($33,Reg);
  324. end;
  325.  
  326.  Function Mouse_Released(Button:integer):boolean;
  327.  {}
  328.  var Reg : Registers;
  329.  begin
  330.      Reg.Ax := 6;
  331.      Reg.Bx := Button;
  332.      Intr($33,Reg);
  333.      Mouse_Released := (Reg.BX > 0);
  334.  end; {of proc Mouse_Released}
  335.  
  336.  Function Mouse_Pressed(Button:integer):boolean;
  337.  {}
  338.  var Reg : Registers;
  339.  begin
  340.      Reg.Ax := 5;
  341.      Reg.Bx := Button;
  342.      Intr($33,Reg);
  343.      Mouse_Pressed := (Reg.BX > 0);
  344.  end; {of proc Mouse_Released}
  345.  
  346.  
  347.  
  348. {++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  349.  
  350.  Function Alt_Pressed:Boolean;
  351.  var
  352.    AltW : word;
  353.  begin
  354.      AltW := swap(Key_Status_Bits);
  355.      Alt_Pressed := (AltW and $0800) <> 0;
  356.  end;
  357.  
  358.  Function Ctrl_Pressed:Boolean;
  359.  var
  360.    CtrlW : word;
  361.  begin
  362.      CtrlW := swap(Key_Status_Bits);
  363.      Ctrl_Pressed := (CtrlW and $0400) <> 0;
  364.  end;
  365.  
  366.  Function LeftShift_Pressed: Boolean;
  367.  {}
  368.  var LSW : word;
  369.  begin
  370.      LSW := swap(Key_Status_Bits);
  371.      LeftShift_Pressed := (LSW and $0200) <> 0;
  372.  end; {of func LeftShift_Pressed}
  373.  
  374.  Function RightShift_Pressed: Boolean;
  375.  {}
  376.  var RSW : word;
  377.  begin
  378.      RSW := swap(Key_Status_Bits);
  379.      RightShift_Pressed := (RSW and $0100) <> 0;
  380.  end; {of func RightShift_Pressed}
  381.  
  382.  Function Shift_Pressed: Boolean;
  383.  {}
  384.  var SW : word;
  385.  begin
  386.      SW := swap(Key_Status_Bits);
  387.      Shift_Pressed := ((SW and $0200) <> 0) or ((SW and $0100) <> 0);
  388.  end; {of func LeftShift_Pressed}
  389.  
  390.  Function CapsOn: Boolean;
  391.  {}
  392.  var CapsOnW : word;
  393.  begin
  394.      CapsOnW := swap(Key_Status_Bits);
  395.      CapsOn := (CapsOnW and $4000) <> 0;
  396.  end; {of func CapsOn}
  397.  
  398.  Function NumOn: Boolean;
  399.  {}
  400.  var NumOnW : word;
  401.  begin
  402.      NumOnW := swap(Key_Status_Bits);
  403.      NumOn := (NumOnW and $2000) <> 0;
  404.  end; {of func NumOn}
  405.  
  406.  Function ScrollOn: Boolean;
  407.  {}
  408.  var ScrollOnW : word;
  409.  begin
  410.      ScrollOnW := swap(Key_Status_Bits);
  411.      ScrollOn := (ScrollOnW and $1000) <> 0;
  412.  end; {of func ScrollOn}
  413.  
  414.  Procedure Set_Caps(On : boolean);
  415.  {}
  416.  begin
  417.      If On then
  418.         Key_Status_Bits := (Key_Status_Bits or $40)
  419.      else
  420.         Key_Status_Bits := (Key_Status_Bits and $BF);
  421.  end; {of proc Set_Caps}
  422.  
  423.  Procedure Set_Num(On : boolean);
  424.  {}
  425.  begin
  426.      If On then
  427.         Key_Status_Bits := (Key_Status_Bits or $20)
  428.      else
  429.         Key_Status_Bits := (Key_Status_Bits and $DF);
  430.  end; {of proc Set_Num}
  431.  
  432.  Procedure Set_Scroll(On : boolean);
  433.  {}
  434.  begin
  435.      If On then
  436.         Key_Status_Bits := (Key_Status_Bits or $10)
  437.      else
  438.         Key_Status_Bits := (Key_Status_Bits and $EF);
  439.  end; {of proc Set_Scroll}
  440.  
  441. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  442.  
  443.    Procedure KeyClick;
  444.    begin
  445.        If KTTT.Click then
  446.        begin
  447.            Sound(1000);
  448.            Sound(50);
  449.            delay(5);
  450.            nosound;
  451.        end;
  452.    end; {of proc KeyClick}
  453.  
  454. Function GetKey:char;
  455. {waits for keypress or mouse activity}
  456.  
  457. {Note that if an extended key is pressed e.g. F1, then a value of 128 is
  458.  added to the Char value. Also if a mouse is active the trapped mouse
  459.  activity is returned as follows:
  460.  
  461. }
  462.  
  463. Const
  464.  H = 40;
  465.  V = 13;
  466.  MouseUp    =  #128;
  467.  MouseDown  =  #129;
  468.  MouseLeft  =  #130;
  469.  MouseRight =  #131;
  470.  MouseEsc   =  #132;
  471.  MouseEnter =  #133;
  472. var
  473.   Action,
  474.   Finished : boolean;
  475.   Hor, Ver : integer;
  476.   B : button;
  477.   Ch : char;
  478. begin
  479.     Finished := false;
  480.     Action := false;
  481.     B := NoB;
  482.     If Moused then Move_Mouse(H,V);     {logically put mouse in middle of screen}
  483.     Repeat                      {keep checking Mouse for activity until keypressed}
  484. {$IFDEF VER50}
  485.          KTTT.Idle_Hook;
  486. {$ELSE}
  487.          If Idle_Hook <> Nil then
  488.             Call_Idle_Hook;
  489. {$ENDIF}
  490.          If Moused then
  491.          begin
  492.              Get_Mouse_Action(B,Hor,Ver);
  493.              Case B of
  494.              LeftB : begin
  495.                          Ch := MouseEnter;
  496.                          Finished := true;
  497.                          Delay(200);
  498.                          Repeat
  499.                          Until Mouse_Pressed(0) = false; {absorb}
  500.                      end;
  501.              RightB: begin
  502.                          Ch := MouseEsc;
  503.                          Finished := true;
  504.                          Delay(200);
  505.                          Repeat
  506.                          Until Mouse_Pressed(1) = false; {absorb}
  507.                      end;
  508.              end; {case}
  509.  
  510.              If (Ver - V) > 1 then
  511.              begin
  512.                  Ch := MouseDown;
  513.                  Finished := true;
  514.              end
  515.              else
  516.                 If (V - Ver) > 1 then
  517.                 begin
  518.                     Ch := MouseUp;
  519.                     Finished := true;
  520.                 end
  521.                 else
  522.                    If (Hor - H) > Horiz_Sensitivity then
  523.                    begin
  524.                        Ch := MouseRight;
  525.                        Finished := true;
  526.                    end
  527.                    else
  528.                       If (H - Hor) > Horiz_Sensitivity then
  529.                       begin
  530.                           Ch := MouseLeft;
  531.                           Finished := true;
  532.                       end;
  533.          end;
  534.          If Keypressed or finished then Action := true;
  535.     until Action;
  536.     While not finished do
  537.     begin
  538.         Finished := true;
  539.         Ch := ReadKey;
  540.         KeyClick;
  541.         if Ch = #0 then
  542.         begin
  543.             Ch := ReadKey;
  544.             Case ord(Ch) of    {set to TTT value}
  545.             15,
  546.             16..25,
  547.             30..38,
  548.             44..50,
  549.             59..68,
  550.             71..73,
  551.             75,77,
  552.             79..127 : Ch := chr(ord(Ch) + 128);
  553.             128..140: Ch := chr(ord(Ch) + 6);
  554.             else      Finished := false;
  555.             end;  {case}
  556.         end;
  557.     end;
  558. {$IFDEF VER50}
  559.       KTTT.Pressed_Hook(Ch);
  560. {$ELSE}
  561.       If Pressed_Hook <> Nil then
  562.          Call_Pressed_Hook(Ch);
  563. {$ENDIF}
  564.     GetKey := Ch;
  565. end;
  566.  
  567. Procedure DelayKey(Time : integer);
  568. var
  569.   I : Integer;
  570.   ChD : char;
  571. begin
  572.     I := 1;
  573.     While I < Time DIV 100 do
  574.     begin
  575.         Delay(100);
  576.         I := succ(I);
  577.         If Keypressed then
  578.         begin
  579.             I := MaxInt;
  580.             ChD := GetKey;           {absorb the keypress}
  581.         end;
  582.     end;
  583. end; {DelayKey}
  584.  
  585. begin   {unit initialization code}
  586.     Moused := Mouse_Installed;
  587.     If Moused then Horiz_Sensitivity := 1;
  588.     Default_Settings;
  589. end.
  590.  
  591.